Switch from Network Manager to systemd-networkd
Nowadays, most major Linux distributions adopted Systemd as a default init system, which is basically a suite of basic building blocks for a Linux system. It provides a system and service manager that runs as PID 1
and starts the rest of the system.
It includes different components, and one of those is systemd-networkd, which is responsible for network configuration:
- Basic DHCP/static IP networking for network devices.
- Virtual networking features: bridges, tunnels and VLANs.
Although wireless networking is not directly handled by systemd-networkd, you can use wpa_supplicant service to configure wireless adapters, and then hook it up with systemd-networkd.
Why not Network Manager?
I personally use NetworkManager to handle my network connectionson my desktop/laptops computers because it is easy to setup and play around with it, but there are situations where I want full compatibility with Systemd, for example when dealing with a headless server. It is in essence free to the consumer…or even better “use the best tool for the right job”.
Making the move
It is very straightforward to move from Network Manager to systemd-networkd. As a first step let’s disable Network Manager
service and enable systemd-networkd
service:
$ sudo systemctl stop NetworkManager
$ sudo systemctl disable NetworkManager
$ sudo systemctl enable systemd-networkd
As a second step, we have to enable and start systemd-resolved
service, which is used by systemd-networkd
for network name resolution. This service implements a caching DNS server.
$ sudo systemctl enable systemd-resolved
$ sudo systemctl start systemd-resolved
Systemd-resolved
will create its own resolv.conf
under /run/systemd
directory. However, it is a common practise to store DNS resolver information in /etc/resolv.conf
, and many applications still rely on /etc/resolv.conf
. That is why we have to create a symlink to /etc/resolv.conf
for compatibility reasons:
$ sudo rm /etc/resolv.conf
$ sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
Setting up network connections
Network configuration information are represented by text files with .network
extension in the directory /etc/systemd/network
. We can create as many files as we would like to but keep in mind that they are processed in lexical order so if you have some configuration overlapping inside these files, the last one is the one who wins.
If the mentioned folder does not exist, let’s proceed to create it:
$ sudo mkdir /etc/systemd/network
Before creating network configuration, let’s display the available network interfaces (we are going to need them):
$ networkctl
Its output:
IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier unmanaged
2 enp3s0 ether routable configured
2 links listed.
Static IP
In order to setup a network interface with a static IP, we have to create its corresponding file:
$ sudo vim /etc/systemd/network/00-enp3s0.network
With this content:
[Match]
Name=enp3s0
[Network]
Address=192.168.1.50/24
Gateway=192.168.1.1
DNS=192.168.1.1
As we can see, the [Match]
label represents the network interface by the usage of udev names (enp3s0) instead of kernel names (eth0).
Attention
This distinction is important so the 'udev' module can correctly detect the network interface and configure it properly.DHCP
With DHCP we follow the exact process above and change the configuration file content to:
[Match]
Name=enp3s0
[Network]
DHCP=yes
Restarting the service
Once we are done with our changes, it is required that we restart our service (if you want to know more about handling services, please check this):
$ sudo systemctl restart systemd-networkd
Now we can see our IP Address and the changes we have applied in this post.
References
- Systemd Arch Linux Wiki
- Systemd-networkd Arch Linux Wiki
- Wpa_suplication Arch Linux Wiki
- Switch from Network Manager to systemd-network by Dan Nanni